package com.sjc.designpattern.mediator;

/**
 * @Classname MediatorPatternDemo
 * @Description 中介者模式：让互相调用的模块之间解耦合
 * 三个模块: 模块1调用模块2和模块3；模块2要调用模块1和模块3；模块3要调用模块1和模块2
 * 本质是解耦
 * 企业看法中很多都是用消息队列异步解耦。很少见封装一个所谓的中介者去让各个模块解耦。
 * @Date 2020/4/25 21:16
 * @Created by SangJiacun
 */
public class MediatorPatternDemo {
    public static void main(String[] args) {
        Mediator mediator = new Mediator();

        ModuleA moduleA = new ModuleA(mediator);
        ModuleB moduleB = new ModuleB(mediator);
        ModuleC moduleC = new ModuleC(mediator);

        moduleA.execute();
        moduleB.execute();
        moduleC.execute();

        // 好处是什么？
        // moduleA，只要知道一个中介者就可以了，具体跟其他模块的交互都封装在中介者里面了
        // moduleB，同上
        // moduleC，同上
        // moduleA、B、C之间不再有任何的耦合，不再有复杂的交互关系，互相之间修改不会对对方产生什么影响
    }

    public static class Mediator{
        private ModuleA moduleA;
        private ModuleB moduleB;
        private ModuleC moduleC;

        public void moduleAInvoke(){
            moduleB.execute("模块A通知中介者");
            moduleC.execute("模块A通知中介者");
        }

        public void moduleBInvoke() {
            moduleA.execute("模块B通知中介者");
            moduleC.execute("模块B通知中介者");
        }

        public void moduleCInvoke() {
            moduleA.execute("模块C通知中介者");
            moduleB.execute("模块C通知中介者");
        }

        public ModuleA getModuleA() {
            return moduleA;
        }

        public void setModuleA(ModuleA moduleA) {
            this.moduleA = moduleA;
        }

        public ModuleB getModuleB() {
            return moduleB;
        }

        public void setModuleB(ModuleB moduleB) {
            this.moduleB = moduleB;
        }

        public ModuleC getModuleC() {
            return moduleC;
        }

        public void setModuleC(ModuleC moduleC) {
            this.moduleC = moduleC;
        }
    }

    public static class ModuleA{

        private Mediator mediator;

        public ModuleA(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleA(this);
        }

        public void execute(){
            mediator.moduleAInvoke();
        }

        public void execute(String invoker){
            System.out.println(invoker + "在调用模块A的功能");
        }
    }

    public static class ModuleB{
        private Mediator mediator;

        public ModuleB(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleB(this);
        }

        public void execute(){
            mediator.moduleBInvoke();
        }

        public void execute(String invoker){
            System.out.println(invoker + "在调用模块B的功能");
        }
    }

    public static class ModuleC{
        private Mediator mediator;

        public ModuleC(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleC(this);
        }

        public void execute(){
            mediator.moduleCInvoke();
        }

        public void execute(String invoker){
            System.out.println(invoker + "在调用模块C的功能");
        }
    }

}
